<?php

/**
 * 数据库处理类
 *
 * 如果多次声明 DB 类对象, 对于相同的服务器, 数据库, 用户名, 以及数据库类型, 将会得到同一个实例.
 */

class DB extends PDO
{
    /**
     * 数据表前缀
     * @var string
     */
    protected $pre;

    protected static $instances = array();

    protected static $on = false;

    protected $stm;

    protected $cache;

    public function __construct($host, $user, $pw, $dbname, $driver, $pre="")
    {
        if(!self::$on){
            $this->errMsg("只能用 DB::getInstance() 产生一个 DB 类的实例");
        }
        $this->pre = $pre;

        parent::__construct("$driver:host=$host;dbname=$dbname", $user, $pw);
    }

    public function count($table, $where=1)
    {
    	return $this->getCell("SELECT count(*) FROM $table WHERE $where");
    }

    public function getCell($sql)
    {
    	$row = $this->getRow($sql);
    	return $row[0];
    }

    /**
     * 获得 SQL 语句的所有结果
     *
     * @param unknown_type $sql
     * @return unknown
     */
    public function getAll($sql)
    {
    	$stm = $this->query($sql);
    	return !empty($stm)? $stm->fetchAll(PDO::FETCH_ASSOC) : false;
    }

    /**
     * 返回第一条记录
     * @param string $sql
     * @return array
     */
    public function getRow($sql)
    {
    	$stm = $this->query($sql);
        return !empty($stm)? $stm->fetch() : false;
    }

    /**
     * 根据ID读取记录
     * @return array
     */
    public function getById($table, $id)
    {
        return $this->getRow("SELECT * FROM $table WHERE id=$id");
    }

    /**
     * 更新表格里的数据
     * @param string $table 数据表名
     * @param array $updateArr 数组键名是列名, 数组的值是记录被更新后的数据
     * @param string $condition 待更新的数据应该满哪些条件
     * @return int|false 成功则返回被更新的记录数目,否则返回 false
     */
    public function update($table, $updateArr, $condition)
    {
        $set = '';
        foreach($updateArr as $col => $val){
            $set .= "$col='$val',";
        }
        $set = rtrim($set, ",");
        empty($condition) && $condition = "1";
        return $this->exec("UPDATE $table SET $set WHERE $condition");
    }

    public function save($table, $data)
    {
        $cols = join(",", array_keys($data));
        $vals = "'".join("','", array_values($data))."'";
        $q = "INSERT INTO $table($cols) VALUES($vals)";
        return $this->exec($q);
    }

    public function query($sql)
    {
        $this->stm = parent::query($sql);
        return $this->stm;
    }

    /**
     * 从数据表里删除满足条件的记录
     * @param string $table 数据表名
     * @param string $condition 待删除记录应该满足的条件
     * @return int 成功则返回被删除的记录数,否则返回 false
     */
    public function del($table, $condition)
    {
        $sql = "DELETE FROM $table WHERE $condition";
        return $this->exec($sql);
    }
}
